package com.hotel.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hotel.entity.SysUser;
import com.hotel.dto.LoginRequest;
import com.hotel.dto.LoginResponse;

import java.util.List;

/**
 * 系统用户服务接口
 * 
 * @author Hotel Management Team
 */
public interface SysUserService extends IService<SysUser> {

    /**
     * 用户登录
     * 
     * @param request 登录请求
     * @return 登录响应
     */
    LoginResponse login(LoginRequest request);

    /**
     * 用户登出
     * 
     * @param token 用户token
     */
    void logout(String token);

    /**
     * 获取当前用户信息
     * 
     * @param token 用户token
     * @return 用户信息
     */
    SysUser getCurrentUser(String token);

    /**
     * 创建用户
     * 
     * @param user 用户信息
     */
    void createUser(SysUser user);

    /**
     * 更新用户
     * 
     * @param user 用户信息
     */
    void updateUser(SysUser user);

    /**
     * 删除用户
     * 
     * @param id 用户ID
     */
    void deleteUser(Long id);

    /**
     * 重置密码
     * 
     * @param id 用户ID
     */
    void resetPassword(Long id);

    /**
     * 修改密码
     * 
     * @param id 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     */
    void changePassword(Long id, String oldPassword, String newPassword);

    void changePassword(String token, String oldPassword, String newPassword);

    /**
     * 启用用户
     * 
     * @param id 用户ID
     */
    void enableUser(Long id);

    /**
     * 禁用用户
     * 
     * @param id 用户ID
     */
    void disableUser(Long id);

    /**
     * 分页查询用户列表
     * 
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键词
     * @return 用户列表
     */
    List<SysUser> getUserList(Integer page, Integer size, String keyword);

    /**
     * 根据用户名查询用户
     * 
     * @param username 用户名
     * @return 用户信息
     */
    SysUser getUserByUsername(String username);

    /**
     * 检查用户名是否存在
     * 
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 检查邮箱是否存在
     * 
     * @param email 邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);

    /**
     * 检查手机号是否存在
     * 
     * @param phone 手机号
     * @return 是否存在
     */
    boolean existsByPhone(String phone);

    /**
     * 验证用户密码
     * 
     * @param username 用户名
     * @param password 密码
     * @return 是否验证成功
     */
    boolean validatePassword(String username, String password);

    /**
     * 更新最后登录时间
     * 
     * @param id 用户ID
     */
    void updateLastLoginTime(Long id);

    /**
     * 获取用户权限
     * 
     * @param userId 用户ID
     * @return 权限列表
     */
    List<String> getUserPermissions(Long userId);

    /**
     * 获取用户角色
     * 
     * @param userId 用户ID
     * @return 角色列表
     */
    List<String> getUserRoles(Long userId);

    /**
     * 生成JWT Token
     * 
     * @param user 用户信息
     * @return JWT Token
     */
    String generateToken(SysUser user);

    /**
     * 验证JWT Token
     * 
     * @param token JWT Token
     * @return 用户ID
     */
    Long validateToken(String token);

    /**
     * 刷新Token
     * 
     * @param token 原Token
     * @return 新Token
     */
    String refreshToken(String token);
}